home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Tools & Utilities
/
Collection of Tools and Utilities.iso
/
c
/
recio202.zip
/
testcog.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-05-05
|
11KB
|
328 lines
/* testcog.c - tests column delimited get functions */
/* recio version 2.02, release May 5, 1994 */
/* Copyright (C) 1994 William Pierpoint */
#include <ctype.h>
#include <errno.h>
#include <limits.h>
#include <float.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "recio.h"
/* errors normally to stderr; but for test purposes, stdout */
#define errout stdout
/****************************************************************************
Dynamic string copy function, kludged for use with recio. This
function is not part of recio nor was rseterr() designed to work
with it, but you get the idea.
Precondition: set dst to null ptr when declaring it, e.g. char *dst=NULL;
Syntax: the assignment operator is mandatory, i.e. dst=scopys(dst, src);
Obligation: free dst when finished with it.
*****************************************************************************/
char * /* return dst */
scopys( /* copy string dynamically */
char *dst, /* destination string pointer */
char *src) /* source string pointer */
/****************************************************************************/
{
size_t dlen; /* strlen of dst */
size_t slen; /* strlen of src */
int errnum; /* error number */
/* if null src pointer */
if (!src) {
rseterr(NULL, EINVAL);
dst = NULL;
goto done;
}
if (dst) {
dlen = strlen(dst);
slen = strlen(src);
if (dlen < slen) {
do {
dst = (char *) realloc(dst, slen+1);
if (!dst) {
errnum = rseterr(NULL, ENOMEM);
if (errnum) goto done;
}
} while (!dst);
}
strcpy(dst, src);
} else {
do {
dst = strdup(src);
if (!dst) {
errnum = rseterr(NULL, ENOMEM);
if (errnum) goto done;
}
} while (!dst);
}
done:
return dst;
}
/****************************************************************************/
void /* return nothing */
rfixnumber( /* fix number */
REC *rp, /* record pointer */
int errnum, /* error number */
int (*rfix)(REC *)) /* rfix function pointer */
/****************************************************************************/
{
switch (errnum) {
case R_EMISDAT:
fprintf(errout, "...substituting zero\n");
rsetfldstr(rp, "0");
break;
case R_EINVDAT:
case R_ERANGE:
fprintf(errout, "...substituting best guess\n");
rfix(rp);
break;
}
}
/****************************************************************************/
void /* return nothing */
rfixchar( /* fix character */
REC *rp, /* record pointer */
int errnum, /* error number */
int (*rfix)(REC *)) /* rfix function pointer */
/****************************************************************************/
{
switch (errnum) {
case R_EMISDAT:
fprintf(errout, "...substituting the letter N\n");
rsetfldstr(rp, "N");
break;
case R_EINVDAT:
fprintf(errout, "...substituting best guess\n");
rfix(rp);
break;
}
}
/****************************************************************************/
void /* returns nothing */
rwarnfn( /* recio callback warning function */
REC *rp) /* record pointer */
/****************************************************************************/
{
if (risvalid(rp)) {
switch (rwarning(rp)) {
case R_WNOREG: /* atexit() full */
fprintf (errout, "WARNING %s\n", rwarnstr(rp));
break;
case R_WEMPSTR: /* empty data string */
fprintf(errout, "WARNING reading %s at record %lu and field %u -- %s\n",
rnames(rp), rrecno(rp), rfldno(rp), rwarnstr(rp));
break;
}
}
}
/****************************************************************************/
void /* returns nothing */
rerrfn( /* recio callback error function */
REC *rp) /* record pointer */
/****************************************************************************/
{
int errnum; /* error number */
if (risvalid(rp)) {
/* if reof indicator set */
if (reof(rp)) {
fprintf(errout, "ERROR reading %s: "
"tried to read past end of file\n", rnames(rp));
/* else rerror indicator set */
} else {
/* determine cause of error */
errnum = rerror(rp);
switch (errnum) {
/* data errors */
case R_ERANGE: /* data out of range */
case R_EINVDAT: /* invalid data */
case R_EMISDAT: /* missing data */
fprintf(errout, "DATA ERROR reading %s at record %lu and field %u "
"-- %s\n", rnames(rp), rrecno(rp), rfldno(rp), rerrstr(rp));
/* determine context */
switch (rcxtno(rp)) {
case RECIN:
/* determine field */
switch (rfldno(rp)) {
case 1: /* the integer field i */
rfixnumber(rp, errnum, rfixi);
break;
case 2: /* the unsigned integer field ui */
rfixnumber(rp, errnum, rfixui);
break;
case 3: /* the long field l */
rfixnumber(rp, errnum, rfixl);
break;
case 4: /* the unsigned long field ul */
rfixnumber(rp, errnum, rfixul);
break;
case 5: /* the float field f */
rfixnumber(rp, errnum, rfixf);
break;
case 6: /* the double field d */
rfixnumber(rp, errnum, rfixd);
break;
case 7: /* the character field ch */
rfixchar(rp, errnum, rfixc);
break;
default: /* programming error - no case for field */
fprintf(errout, "FATAL ERROR %s -- code missing for field %u\n",
rnames(rp), rfldno(rp));
break;
}
break;
default: /* programming error - missing context number */
fprintf(errout, "FATAL ERROR %s -- missing context number\n",
rnames(rp));
abort();
break;
}
break;
/* fatal errors (R_EINVMOD, R_EINVAL, R_ENOMEM) */
default:
fprintf(errout, "FATAL ERROR %s -- %s\n", rnames(rp), rerrstr(rp));
abort();
break;
}
}
/* invalid record pointer */
} else {
switch (errno) {
/* non-fatal errors */
case EACCES:
case EMFILE:
fprintf(errout, "WARNING: %s\n", strerror(errno));
break;
/* fatal errors (EINVAL, ENOMEM) */
default:
fprintf(errout, "FATAL ERROR: %s\n", strerror(errno));
abort();
break;
}
}
}
/****************************************************************************/
void putcolnumbers(void)
/****************************************************************************/
{
puts(" 1 2 3 4 5 6 7");
puts("1234567890123456789012345678901234567890123456789012345678901234567890");
}
/****************************************************************************
main
*****************************************************************************/